import axios, { AxiosError, type Method } from 'axios'
import { useUserStore } from '@/storces/user'
import type { ResDate } from '@/types/index.d.ts'
import { showFailToast } from 'vant'

const baseURL = 'https://consult-api.itheima.net/'
const instance = axios.create({
  baseURL: baseURL,
  timeout: 5000 // request timeout
})

// 一个拦截器只做一件事情，请求拦截器是从后往前的
// 请求拦截器从后往前，响应拦截器从前往后
instance.interceptors.request.use(
  (config) => {
    const store = useUserStore()
    if (store.uyUser?.token) {
      // config.headers['Authorization'] = `Bearer ${store.uyUser?.token}`
      config.headers['Authorization'] = `Bearer aaaaa`
    }
    console.log('config', config)
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)

instance.interceptors.response.use(
  (response) => {
    const res = response.data
    if (res.code === 10000) {
      return res
    }
    // 规范类型错误
    const axiosError = new AxiosError()
    axiosError.response = res
    return Promise.reject(axiosError)
  },
  (error) => {
    // 报错之后会走这一条，若不return出去的话，下一个拦截器没有办法执行
    console.log('接口信息报错' + error)
    return Promise.reject(error)
  }
)

// 响应拦截器401错误
instance.interceptors.response.use(undefined, (err) => {
  if (err.response.status === 401) {
    // 清空用户数据
    const store = useUserStore()
    store.deleteUserInfo()
    showFailToast('用户登录过期')
    // 跳转登陆页面
    // 返回一个截取状态
    return new Promise(() => {})
  }
  return Promise.reject(err)
})

// 自己封装请求方法
// 函数式写ts
export const request = <T, D>(
  method: Method = 'GET',
  url: string,
  data?: T
) => {
  return instance<any, ResDate<D>>({
    method,
    url,
    [method.toUpperCase() === 'GET' ? 'paramas' : 'data']: data
  })
}

// 这一块，可以反复看，感觉不太理解
// export function request<T, D = any>(
//   method: Method = 'GET',
//   url: string,
//   data?: D
// ) {
//   return instance<any, ResDate<T>>({
//     method,
//     url,
//     [method.toUpperCase() === 'GET' ? 'params' : 'data']: data
//   })
// }

export default instance
